home *** CD-ROM | disk | FTP | other *** search
/ Amiga Magazin: Amiga-CD 1996 September & October / Amiga-CD 1996 #9-10.iso / demos / storm-c / stormwizard / example-source / c-source / tree / tree.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-06-18  |  7.3 KB  |  297 lines

  1. /* Demonstration der Hierarchieklasse.
  2.  
  3.    (geschrieben unter StormC V1.1)
  4.  
  5.    $VER:              1.0 (12.06.96)
  6.  
  7.    Autor:             Thomas Mittelsdorf
  8.  
  9.    © 1996 HAAGE & PARTNER Computer GmbH,  All Rights Reserved
  10.  
  11. */
  12.  
  13. #include    <stdio.h>
  14. #include    <stdlib.h>
  15. #include    <string.h>
  16.  
  17. #include    <exec/exec.h>
  18. #include    <exec/memory.h>
  19.  
  20. #include    <clib/alib_protos.h>
  21.  
  22. #include    <pragma/asl_lib.h>
  23. #include    <pragma/dos_lib.h>
  24. #include    <pragma/exec_lib.h>
  25. #include    <pragma/intuition_lib.h>
  26. #include    <pragma/utility_lib.h>
  27. #include    <pragma/wizard_lib.h>
  28.  
  29. #include    <dos/dos.h>
  30. #include    <libraries/asl.h>
  31. #include    <libraries/wizard.h>
  32. #include    <intuition/gadgetclass.h>
  33. #include    <intuition/intuition.h>
  34.  
  35. #define HierarchyID         2
  36. #define ArgumentID            8
  37. #define VectorButtonID     9
  38.  
  39. struct Library *AslBase;
  40. struct Library *WizardBase;
  41. struct Library *UtilityBase;
  42.  
  43. APTR    MySurface;
  44.  
  45. struct Gadget *MyGadgets[10];
  46.  
  47. struct Screen *MyScreen;
  48. struct FileRequester *MyFReq;
  49.  
  50. struct Window *MyWindow;
  51.  
  52. struct NewWindow *MyNewWindow;
  53. struct WizardWindowHandle *MyWinHandle;
  54.  
  55. char ArgumentPuffer[256]="";
  56.  
  57. struct MyTreeNode
  58. {
  59.     struct WizardDefaultNode WNode;
  60.  
  61.     struct MinList list;
  62.  
  63.     char Name[32];
  64.     int Type;
  65. };
  66.  
  67. struct MinList MyList;
  68. struct MinList DummyList;
  69.  
  70. void FreeMyTreeList(struct MinList *list)
  71. {
  72.     while (list->mlh_Head->mln_Succ)
  73.     {
  74.         struct MyTreeNode *t=(struct MyTreeNode *)list->mlh_Head;
  75.  
  76.         FreeMyTreeList(&t->list);
  77.  
  78.         Remove((struct Node *)t);
  79.         FreeVec(t);
  80.     }
  81. };
  82.  
  83. void ReadDir(STRPTR dir,struct MinList *list,struct MyTreeNode *parent)
  84. {
  85.     struct FileInfoBlock fib;
  86.  
  87.     BPTR mylock;
  88.  
  89.     if ((mylock=Lock(dir,SHARED_LOCK)))
  90.     {
  91.         if (Examine(mylock,&fib))
  92.         {
  93.             while(ExNext(mylock,&fib))
  94.             {
  95.                 struct MyTreeNode *NewNode;
  96.  
  97.                 if ((NewNode=(struct MyTreeNode *)AllocVec(sizeof(MyTreeNode),MEMF_CLEAR|MEMF_PUBLIC)))
  98.                 {
  99.                     long Ready=FALSE;
  100.                     struct MyTreeNode *PredNode=(struct MyTreeNode *)list->mlh_Head;
  101.  
  102.                     NewList((struct List *)&NewNode->list);
  103.  
  104.                     strcpy(NewNode->Name,fib.fib_FileName);
  105.  
  106.                     WZ_InitNode(&NewNode->WNode.WizardNode,1,
  107.                                                                 WNODEA_Flags,WNF_TREE|WNF_AUTOMATIC,
  108.                                                                 TAG_DONE);
  109.  
  110.                     WZ_InitNodeEntry(&NewNode->WNode.WizardNode,0,
  111.                                                                         WENTRYA_Type,WNE_TREE,
  112.                                                                         WENTRYA_TreeParentNode,parent,
  113.                                                                         WENTRYA_TreeString,NewNode->Name,
  114.                                                                         WENTRYA_TreePen,WZRD_TEXTPEN,
  115.                                                                         WENTRYA_TreeSPen,WZRD_FILLTEXTPEN,
  116.                                                                         TAG_DONE);
  117.  
  118.                     if (fib.fib_DirEntryType>=0)
  119.                     {
  120.                         char NewDir[256];
  121.  
  122.                         WZ_InitNodeEntry(&NewNode->WNode.WizardNode,0,
  123.                                                                             WENTRYA_TreeChilds,&NewNode->list,
  124.                                                                             TAG_DONE);
  125.  
  126.                         WZ_InitNodeEntry(&NewNode->WNode.WizardNode,0,
  127.                                                                             WENTRYA_TreePen,WZRD_HIGHLIGHTTEXTPEN,
  128.                                                                             WENTRYA_TreeSPen,WZRD_HIGHLIGHTTEXTPEN,
  129.                                                                             TAG_DONE);
  130.  
  131.  
  132.                         NewNode->Type=0;
  133.  
  134.                         strcpy (NewDir,dir);
  135.                         if (AddPart(NewDir,fib.fib_FileName,sizeof(NewDir)))
  136.                             ReadDir(NewDir,&NewNode->list,NewNode);
  137.                     }
  138.                     else
  139.                     {
  140.                         NewNode->Type=1;
  141.                     }
  142.  
  143.                     while (!Ready && PredNode->WNode.WizardNode.Node.mln_Succ)
  144.                     {
  145.                         if (NewNode->Type>=PredNode->Type)
  146.                         {
  147.                             if (NewNode->Type==PredNode->Type)
  148.                             {
  149.                                 if (Stricmp(NewNode->Name,PredNode->Name)<0)
  150.                                 {
  151.                                     PredNode=(struct MyTreeNode *)PredNode->WNode.WizardNode.Node.mln_Pred;
  152.                                     Ready=TRUE;
  153.                                 }
  154.                                 else
  155.                                     PredNode=(struct MyTreeNode *)PredNode->WNode.WizardNode.Node.mln_Succ;
  156.                             }
  157.                             else
  158.                                 PredNode=(struct MyTreeNode *)PredNode->WNode.WizardNode.Node.mln_Succ;
  159.                         }
  160.                         else
  161.                         {
  162.                             PredNode=(struct MyTreeNode *)PredNode->WNode.WizardNode.Node.mln_Pred;
  163.                             Ready=TRUE;
  164.                         }
  165.                     };
  166.                     Insert((struct List *)list,(struct Node *)NewNode,(struct Node *)PredNode);
  167.                 }
  168.             }
  169.         }
  170.         UnLock(mylock);
  171.     }
  172. }
  173.  
  174. void main( void)
  175. {
  176.     NewList((struct List *)&MyList);
  177.     NewList((struct List *)&DummyList);
  178.  
  179.     if ((UtilityBase=OpenLibrary("utility.library",0L)))
  180.     {
  181.         if ((WizardBase=OpenLibrary("wizard.library",0L)))
  182.         {
  183.             if ((AslBase=OpenLibrary("asl.library",0L)))
  184.             {
  185.                 if ((MySurface=WZ_OpenSurface("tree.wizard",0L,TAG_DONE)))
  186.                 {
  187.                     if ((MyScreen=LockPubScreen(0L)))
  188.                     {
  189.                         if ((MyFReq=AllocAslRequestTags(ASL_FileRequest,ASLFR_Screen,MyScreen,
  190.                                                                                             ASLFR_TitleText,"Choose Path ...",
  191.                                                                                             TAG_DONE)))
  192.                         {
  193.                             if ((MyWinHandle=WZ_AllocWindowHandle(MyScreen,0L,MySurface,TAG_DONE)))
  194.                             {
  195.                                 if ((MyNewWindow=WZ_CreateWindowObj(MyWinHandle,1,WWH_GadgetArray,&MyGadgets,
  196.                                                                                                         WWH_GadgetArraySize,sizeof(MyGadgets),
  197.                                                                                                     TAG_DONE)))
  198.                                 {
  199.                                     SetGadgetAttrs(MyGadgets[HierarchyID],0L,0L,WHIERARCHYA_List,&MyList,
  200.                                                                                                                             WHIERARCHYA_Top,TRUE,
  201.                                                                                                                             TAG_DONE);
  202.                                     SetGadgetAttrs(MyGadgets[ArgumentID],0L,0L,WARGSA_Arg0,&ArgumentPuffer,
  203.                                                                                                     TAG_DONE);
  204.  
  205.                                     if ((MyWindow=WZ_OpenWindow(MyWinHandle,MyNewWindow,
  206.                                                                                                         WA_AutoAdjust,TRUE,
  207.                                                                                                         TAG_DONE)))
  208.                                     {
  209.                                         unsigned long Flag=FALSE;
  210.  
  211.                                         struct IntuiMessage *msg;
  212.  
  213.                                         do
  214.                                         {
  215.                                             WaitPort(MyWindow->UserPort);
  216.  
  217.                                             if ((msg=(struct IntuiMessage *)GetMsg(MyWindow->UserPort)))
  218.                                             {
  219.                                                 switch (msg->Class)
  220.                                                 {
  221.                                                     case IDCMP_CLOSEWINDOW:
  222.                                                         {
  223.                                                             Flag=TRUE;
  224.                                                         }
  225.                                                         break;
  226.  
  227.                                                     case IDCMP_IDCMPUPDATE:
  228.                                                         {
  229.  
  230.                                                             switch (GetTagData(GA_ID,0,(struct TagItem *)msg->IAddress))
  231.                                                             {
  232.                                                                 case HierarchyID:
  233.                                                                     {
  234.                                                                         struct MyTreeNode *t;
  235.  
  236.                                                                         if (t=(struct MyTreeNode *)WZ_GetNode(&MyList,GetTagData(WHIERARCHYA_Selected,0,(struct TagItem *)msg->IAddress)))
  237.                                                                         {
  238.                                                                             strcpy(ArgumentPuffer,t->Name);
  239.  
  240.                                                                             SetGadgetAttrs(MyGadgets[ArgumentID],MyWindow,0L,
  241.                                                                                                     WARGSA_Arg0,&ArgumentPuffer,
  242.                                                                                                     TAG_DONE);
  243.                                                                         }
  244.                                                                     }
  245.                                                                     break;
  246.  
  247.                                                                 case VectorButtonID:
  248.                                                                     {
  249.                                                                         WZ_LockWindow(MyWinHandle);
  250.  
  251.                                                                         if (AslRequestTags(MyFReq,ASLFR_DrawersOnly,TRUE,
  252.                                                                                                             TAG_DONE))
  253.                                                                         {
  254.                                                                             SetGadgetAttrs(MyGadgets[HierarchyID],MyWindow,0L,WHIERARCHYA_List,&DummyList,
  255.                                                                                                                     TAG_DONE);
  256.  
  257.                                                                             FreeMyTreeList(&MyList);
  258.  
  259.                                                                             ReadDir(MyFReq->fr_Drawer,&MyList,0L);
  260.  
  261.                                                                             SetGadgetAttrs(MyGadgets[HierarchyID],MyWindow,0L,
  262.                                                                                                     WHIERARCHYA_List,&MyList,
  263.                                                                                                     TAG_DONE);
  264.                                                                         }
  265.  
  266.                                                                         WZ_UnlockWindow(MyWinHandle);
  267.  
  268.                                                                     }
  269.                                                                     break;
  270.                                                             }
  271.  
  272.                                                         }
  273.                                                         break;
  274.                                                 }
  275.                                                 ReplyMsg((struct Message *)msg);
  276.                                             }
  277.  
  278.                                         }while (Flag==FALSE);
  279.  
  280.                                         WZ_CloseWindow(MyWinHandle);
  281.                                     }
  282.                                 }
  283.                                 WZ_FreeWindowHandle(MyWinHandle);
  284.                             }
  285.                             FreeAslRequest(MyFReq);
  286.                         }
  287.                         UnlockPubScreen(0L,MyScreen);
  288.                     }
  289.                     WZ_CloseSurface(MySurface);
  290.                 }
  291.                 CloseLibrary(AslBase);
  292.             }
  293.             CloseLibrary(WizardBase);
  294.         }
  295.         CloseLibrary(UtilityBase);
  296.     }
  297. }